package indiwood.controller;

import indiwood.model.MagazineListVO;
import indiwood.model.MagazineVO;
import indiwood.model.service.MagazineService;

import java.io.File;
import java.io.IOException;

import javax.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

@Controller
@RequestMapping("/magazine")
public class MagazineController extends MultiActionController {
	@Resource(name = "magazineServiceImpl")
	private MagazineService magazineService;
	// 전체 목록 보여주기
	@RequestMapping("/list.do")
	public ModelAndView magazineList(String pageNo) {
		MagazineListVO listvo = magazineService.magazineList(pageNo);
		return new ModelAndView("list.magazine", "lvo", listvo);
	}
	// 글쓰기 화면으로 이동
	@RequestMapping("/write_view.do")
	public ModelAndView writeView(MagazineVO mvo) {
		return new ModelAndView("write_view.magazine");
	}
	// 글쓰기 처리하는 메서드 & 파일 업로드
	@Resource(name = "uploadPath")
	private String path;
	@RequestMapping(value = "/write.do", method = RequestMethod.POST)
	public ModelAndView write(MagazineVO mvo, MultipartFile uploadFile) {
		if (uploadFile != null && !uploadFile.isEmpty()) { // 파일이 존재
			File copyFile = new File(path + "magazine\\"
					+ uploadFile.getOriginalFilename()); // 업로드한 파일을 복사해서 경로로 이동
			mvo.setImagePath(uploadFile.getOriginalFilename());
			try {
				uploadFile.transferTo(copyFile);
			} catch (IllegalStateException | IOException e) {
				e.printStackTrace();
			}
		}
		magazineService.write(mvo);
		return new ModelAndView("redirect:/magazine/showContentNoHit.do?no=" + mvo.getNo());
	}
	// 상세정보 보여주기.
	@RequestMapping("/content.do")
	public ModelAndView showContent(
			int no,
			@CookieValue(value = "springboard2", required = false) String cookieValue,
			HttpServletResponse response) {
		MagazineVO mvo = null;
		if (cookieValue == null) {
			// log.info("springboard2 cookie 존재하지 않으므로 cookie 생성하고 count 증가");
			response.addCookie(new Cookie("springboard2", "|" + no + "|"));
			mvo = magazineService.showContent(no);
		} else if (cookieValue.indexOf("|" + no + "|") == -1) {
			// log.info("springboard2 cookie 존재하지만 "+no+"번글은 처음 조회하므로 count증가");
			cookieValue += "|" + no + "|";
			// 글번호를 쿠키에 추가
			response.addCookie(new Cookie("springboard2", cookieValue));
			mvo = magazineService.showContent(no);
		} else {
			// log.info("springboard2 cookie 존재하고 이전에 해당 게시물 읽었으므로 count 증가x");
			mvo = magazineService.showContentNoHit(no);
		}
		return new ModelAndView("content.magazine", "mvo", mvo);
	}
	// 조회수 증가(x)
	@RequestMapping("/showContentNoHit.do")
	public ModelAndView showContentNoHit(int no) {
		return new ModelAndView("content.magazine", "mvo", magazineService.showContentNoHit(no));
	}
	// 정보 수정 & 파일 업로드 수정
	@RequestMapping(value = "/update.do", method = RequestMethod.POST)
	public ModelAndView updateBoard(MagazineVO mvo, MultipartFile uploadFile) {
		if (uploadFile != null && !uploadFile.isEmpty()) {
			File filePath = new File(path + "magazine\\" + mvo.getImagePath()); // 파일 경로 지정
			filePath.delete(); // 수정하기 전 파일 삭제
			File copyFile = new File(path + "magazine\\"
					+ uploadFile.getOriginalFilename()); // 업로드한 파일을 복사해서 경로로 이동
			mvo.setImagePath(uploadFile.getOriginalFilename());
			try {
				uploadFile.transferTo(copyFile);
			} catch (IllegalStateException | IOException e) {
				e.printStackTrace();
			}
		}
		magazineService.updateBoard(mvo);
		return new ModelAndView("content.magazine", "mvo", magazineService.showContentNoHit(mvo.getNo()));
	}
	// 수정화면 보여주기.
	@RequestMapping("/updateView.do")
	public ModelAndView updateView(int no, String imagePath) {
		return new ModelAndView("update.magazine", "mvo", magazineService.showContentNoHit(no));
	}
	// 정보 삭제 & 파일 삭제
	@RequestMapping("/deleteBoard.do")
	public ModelAndView deleteBoard(String no, String imagePath) {
		File file = new File(path + "magazine\\" + imagePath);
		if (file.exists()) { // 존재하는 파일 삭제
			file.delete();
		}
		magazineService.deleteBoard(no);
		return new ModelAndView("list.magazine", "lvo", magazineService.magazineList("1")); // 삭제 후 1페이지로 이동
	}
}